package com.sztz.excel;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.style.AbstractCellStyleStrategy;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Workbook;

import java.math.BigDecimal;
import java.util.List;

/**
 * Excel单元格样式自定义处理
 * @author yzy
 * @date 2023/1/5 16:07
 */
public class ExcelCellStyleStrategy extends AbstractCellStyleStrategy {
    /**
     * 当前需要处理的workbook对象
     */
    private Workbook workbook;
    /**
     * 单元格格式列表(GENERAL,DATE,INTEGER,DOUBLE)
     */
    private final List<String> cellDataTypes;

    public ExcelCellStyleStrategy(List<String> cellDataTypes){
        this.cellDataTypes = cellDataTypes;
    }
    /**
     * 初始化信息
     * @param workbook 工作表对象
     * @author yzy
     * @date 2023/1/6 9:50
     */
    @Override
    protected void initCellStyle(Workbook workbook) {
        this.workbook = workbook;
    }

    /**
     * 处理表头
     * @param cell 单元格
     * @param head 表头
     * @param relativeRowIndex 行号
     * @author yzy
     * @date 2023/1/6 9:50
     */
    @Override
    protected void setHeadCellStyle(Cell cell, Head head, Integer relativeRowIndex) {}

    /**
     * 处理表体
     * @param cell 单元格
     * @param head 表头
     * @param relativeRowIndex 行号
     * @author yzy
     * @date 2023/1/6 9:51
     */
    @Override
    protected void setContentCellStyle(Cell cell, Head head, Integer relativeRowIndex) {
        CellStyle cellStyle = workbook.createCellStyle();
        //获取单元格的内容
        cell.setCellType(CellType.STRING);
        String cellValue = cell.getStringCellValue();
        //获取单元格的格式
        String dataTypes = cellDataTypes.get(head.getColumnIndex());
        switch (dataTypes){
            case "DOUBLE":
                //浮点数类型
                cell.setCellType(CellType.NUMERIC);
                if(StrUtil.isNotBlank(cellValue)){
                    cell.setCellValue(Double.valueOf(new BigDecimal(cellValue).setScale(2,BigDecimal.ROUND_HALF_UP).toPlainString()));
                    //格式：0.00 另一种方式也可以: HSSFDataFormat.getBuiltinFormat("0.00")
                    cellStyle.setDataFormat((short)2);
                }
                break;
            case "INTEGER":
                //整数类型
                cell.setCellType(CellType.NUMERIC);
                if(StrUtil.isNotBlank(cellValue)){
                    cell.setCellValue(Integer.parseInt(cellValue));
                    cellStyle.setDataFormat((short)1);
                }
                break;
            case "DATE":
                //日期时间格式
                if(StrUtil.isNotBlank(cellValue)){
                    DateTime dateTime = DateUtil.parseDateTime(cellValue);
                    cell.setCellValue(DateUtil.format(dateTime,"yyyy/m/d h:mm"));
                    cellStyle.setDataFormat((short)164);
                }
                break;
            default:
                //其它格式不需要处理

        }
        cell.setCellStyle(cellStyle);
    }
}
